home *** CD-ROM | disk | FTP | other *** search
/ Deutsche Edition 1 / Deutsche Edition 1.iso / amok / amok_lha / amok56.lha / TurboFiles_V2.0 / TFD.mod < prev    next >
Text File  |  1993-08-15  |  14KB  |  510 lines

  1.  
  2. (**********************************************************************
  3.   :Program.    TFD.mod
  4.   :Contents.   Some File-Operations using (Turbo)Files
  5.   :Author.     Stefan Salewski
  6.   :Copyright.  FD
  7.   :Language.   Oberon
  8.   :Translator. Oberon Compiler V2.0
  9.   :History.    V1.1  12-06-91
  10.   :Address.    Stolper Weg 3, D-2160 Stade
  11.   :Imports.    (Turbo)Files
  12. **********************************************************************)
  13.  
  14. MODULE TFD;
  15.   IMPORT
  16.     TF:TurboFiles,
  17.     Break,
  18.     NoGuru,
  19.     io,
  20.     SYSTEM,
  21.     Arguments,
  22.     Strings,
  23.     ASCII,
  24.     Conversions,
  25.     Intuition;
  26.  
  27.   CONST
  28.     prt='PRT:';
  29.     fnf='File not found';
  30.     BufSize=512;
  31.     StringLength=80;
  32.  
  33.   TYPE
  34.     TwoChars=ARRAY 3 OF CHAR;
  35.     FileName=ARRAY StringLength+1 OF CHAR;
  36.     BigString=ARRAY 256 OF CHAR;
  37.   VAR
  38.     file:TF.File;
  39.     i,act:LONGINT;
  40.     numArgs:INTEGER;
  41.     c:CHAR;
  42.     arg1:FileName;
  43.     arg2:TwoChars;
  44.     arg3:BigString;
  45.     short:TwoChars;
  46.     len1,len2,len3:INTEGER;
  47.  
  48.   PROCEDURE MinLongInt(i,j:LONGINT):LONGINT;
  49.   BEGIN
  50.     IF i<j THEN RETURN i ELSE RETURN j END;
  51.   END MinLongInt;
  52.  
  53.   PROCEDURE WriteStr(s:ARRAY OF CHAR);
  54.   (* $CopyArrays- *)
  55.   BEGIN
  56.     io.WriteString(s);
  57.     io.WriteLn;
  58.   END WriteStr;
  59.  
  60.   PROCEDURE GetArg3(text:ARRAY OF CHAR);
  61.   (* $CopyArrays- *)
  62.   BEGIN
  63.     IF arg3[0]=0X THEN
  64.       io.WriteString(text);
  65.       io.ReadString(arg3);
  66.       len3:=Strings.Length(arg3);
  67.       io.WriteLn;
  68.     END;
  69.   END GetArg3;
  70.  
  71.   PROCEDURE Point(VAR c:CHAR;ok:CHAR);
  72.   BEGIN
  73.     IF (c#ok) AND ((c<=CHR(31)) OR ((c>=CHR(128)) AND (c<=CHR(159)))) THEN
  74.       c:='.'
  75.     END
  76.   END Point;
  77.  
  78.   PROCEDURE Usage;
  79.   BEGIN
  80.     Arguments.GetArg(0,arg3);
  81.     io.WriteLn;
  82.     io.WriteString(arg3);
  83.     WriteStr(': A simpel program to show the use of the module (Turbo)Files');
  84.     io.WriteLn;
  85.     WriteStr('(c) 1989 by Stefan Salewski');
  86.     WriteStr('            Stolper Weg 3');
  87.     WriteStr('            D-2160 Stade');
  88.     io.WriteLn;
  89.     WriteStr('Usage:');
  90.     io.WriteString(arg3);
  91.     WriteStr(" FileName (C|D|E|H|I|L|N|P|S|T) [String]");
  92.     WriteStr("The letter determines the Action:");
  93.     WriteStr("C: Codes the File 'FileName' with 'String'");
  94.     WriteStr("D: Decodes the File 'FileName' with 'String'");
  95.     WriteStr("E: Compares the file 'FileName' with file 'String'");
  96.     WriteStr("H: Types the file 'FileName' as HexDump");
  97.     WriteStr("I: Transforms the File 'FileName' to M2-INLINE-Code");
  98.     WriteStr("L: Prints the file 'FileName' with Linenumbers");
  99.     WriteStr("N: Types the file 'FileName' with LineNumbers");
  100.     WriteStr("P: Prints the file 'FileName' with header and pagenumbers");
  101.     WriteStr("S: Search in the File 'FileName' for 'String'");
  102.     WriteStr("T: Types the File 'FileName'");
  103.   END Usage;
  104.  
  105.   PROCEDURE Print(numbers:BOOLEAN);
  106.     CONST
  107.       Top=4;
  108.       Header=2;
  109.       Bottom=4;
  110.       init='\ec\e#1';
  111.       underlineOn= '\[4m';
  112.       underlineOff='\[24m';
  113.     VAR
  114.       printer:TF.File;
  115.       str1:ARRAY 7 OF CHAR;
  116.       i,line,row,page,pageSize,paperWidth,paperLength:INTEGER;
  117.       fileSize:LONGINT;
  118.  
  119.     PROCEDURE GetPaper(VAR len,width:INTEGER);
  120.     VAR
  121.       p:Intuition.Preferences;
  122.     BEGIN
  123.       Intuition.GetPrefs(p,SYSTEM.SIZE(Intuition.Preferences));
  124.       len:=p.paperLength;
  125.       width:=p.printRightMargin-p.printLeftMargin;
  126.     END GetPaper;
  127.  
  128.     PROCEDURE NewLine(lines:INTEGER);
  129.       CONST
  130.         crlf='\eE';
  131.       VAR
  132.         i:INTEGER;
  133.     BEGIN
  134.       i:=0;
  135.       WHILE i<lines DO
  136.         IF TF.WriteString(printer,crlf) THEN END;
  137.         INC(i);
  138.       END
  139.     END NewLine;
  140.  
  141.   BEGIN
  142.     GetPaper(paperLength,paperWidth);
  143.     line:=0;
  144.     row:=0;
  145.     page:=0;
  146.     c:=ASCII.eol;
  147.     pageSize:=paperLength-Top-Header-Bottom;
  148.     io.WriteString('Printing the File: ');
  149.     WriteStr(arg1);
  150.     io.WriteLn;
  151.     IF TF.Open(file,arg1,BufSize,TF.oldFile) THEN
  152.       IF TF.Open(printer,prt,BufSize,TF.newFile) THEN
  153.         fileSize:=TF.Size(file);
  154.         IF TF.WriteString(printer,init) THEN END;
  155.         WHILE (file.res=TF.done) AND (printer.res=TF.done) DO
  156.           IF (c=ASCII.eol) OR (row MOD paperWidth=0) THEN
  157.             IF c#ASCII.eol THEN
  158.               IF TF.WriteChar(printer,c) THEN END;
  159.             END;
  160.             IF ((line MOD pageSize)=0) AND (TF.GetPos(file)<fileSize) THEN
  161.               IF line>0 THEN
  162.                 NewLine(Bottom+1);
  163.               END;
  164.               INC(page);
  165.               NewLine(Top);
  166.               IF TF.WriteString(printer,underlineOn) THEN END;
  167.               IF TF.WriteString(printer,'Page ') THEN END;
  168.               IF Conversions.IntToStr(page,str1,10,4,' ') THEN END;
  169.               IF TF.WriteString(printer,str1) THEN END;
  170.               IF TF.WriteString(printer,'   File: ') THEN END;
  171.               IF TF.WriteString(printer,arg1) THEN END;
  172.               IF TF.WriteString(printer,underlineOff) THEN END;
  173.               NewLine(Header);
  174.             ELSE
  175.               NewLine(1)
  176.             END;
  177.             INC(line);
  178.             IF numbers AND (TF.GetPos(file)<fileSize) THEN
  179.               IF Conversions.IntToStr(line,str1,10,5,' ') THEN END;
  180.               IF TF.WriteString(printer,str1) THEN END;
  181.               IF TF.WriteString(printer,'  ') THEN END;
  182.               row:=5+2;
  183.             ELSE
  184.               row:=0;
  185.             END;
  186.           ELSE
  187.             IF TF.WriteChar(printer,c) THEN END;
  188.           END;
  189.           INC(row);
  190.           IF TF.ReadChar(file,c) THEN END;
  191.         END;
  192.         i:=line MOD pageSize;
  193.         IF i>1 THEN
  194.           NewLine(paperLength-Top-Header-Bottom-i+1)
  195.         END;
  196.         NewLine(Bottom);
  197.         WriteStr('Ready');
  198.         IF TF.Close(printer) THEN END;
  199.       ELSE
  200.         WriteStr('Cannot open Printer!');
  201.       END;
  202.       IF TF.Close(file) THEN END;
  203.     ELSE
  204.       WriteStr(fnf);
  205.     END;
  206.   END Print;
  207.  
  208.   PROCEDURE Type(numbers:BOOLEAN);
  209.   VAR
  210.     i,line:INTEGER;
  211.   BEGIN
  212.     io.WriteString('Typing the File: ');
  213.     WriteStr(arg1);
  214.     io.WriteLn;
  215.     IF TF.Open(file,arg1,BufSize,TF.oldFile) THEN
  216.       line:=0;
  217.       WHILE file.res=TF.done DO
  218.         i:=TF.ReadString(file,arg3);
  219.         IF ((i>0) OR (file.res=TF.done)) THEN
  220.           IF numbers THEN
  221.             INC(line);
  222.             io.WriteInt(line,4);
  223.             io.Write(' ');
  224.           END;
  225.           io.WriteString(arg3);
  226.           io.WriteLn;
  227.         END;
  228.       END;
  229.       IF TF.Close(file) THEN END;
  230.     ELSE
  231.       WriteStr(fnf);
  232.     END;
  233.   END Type;
  234.  
  235.   PROCEDURE TypeHex;
  236.   VAR
  237.     line:INTEGER;
  238.     str2: ARRAY 5 OF CHAR;
  239.   BEGIN
  240.     io.WriteString('Hexdump of: ');
  241.     WriteStr(arg1);
  242.     io.WriteLn;
  243.     IF TF.Open(file,arg1,BufSize,TF.oldFile) THEN
  244.       line:=0;
  245.       WHILE file.res=TF.done DO
  246.         act:=TF.ReadBytes(file,SYSTEM.ADR(arg3),16);
  247.         IF act>0 THEN
  248.           io.WriteHex(line,4);
  249.           io.Write(':');
  250.           i:=0;
  251.           WHILE i<16 DO
  252.             IF (SYSTEM.VAL(LONGSET,i)*LONGSET{0..1})=LONGSET{} THEN
  253.               io.Write(' ');
  254.             END;
  255.             IF i<act THEN
  256.               IF Conversions.IntToStr(SYSTEM.VAL(SHORTINT,arg3[i]),
  257.                  str2,16,2,'0') THEN END;
  258.               io.WriteString(str2)
  259.             ELSE
  260.               io.WriteString('  ')
  261.             END;
  262.             INC(i);
  263.           END;
  264.           io.WriteString('    ');
  265.           i:=0;
  266.           WHILE i<16 DO
  267.             Point(arg3[i],'.');
  268.             INC(i);
  269.           END;
  270.           arg3[act]:=0X;
  271.           WriteStr(arg3);
  272.           INC(line,16);
  273.         END;
  274.       END;
  275.       IF TF.Close(file) THEN END;
  276.     ELSE
  277.       WriteStr(fnf);
  278.     END;
  279.   END TypeHex;
  280.  
  281.   PROCEDURE CodeIt(decode:BOOLEAN);
  282.   BEGIN
  283.     GetArg3('CodeWord: ');
  284.     IF TF.Code(arg1,arg3,decode) THEN
  285.       io.WriteString('File ');
  286.       io.WriteString(arg1);
  287.       io.Write(' ');
  288.       IF decode THEN
  289.         io.WriteString('de')
  290.       END;
  291.       io.WriteString('coded with CodeWord: ');
  292.       WriteStr(arg3)
  293.     ELSE
  294.       WriteStr(fnf);
  295.     END;
  296.   END CodeIt;
  297.  
  298.   PROCEDURE Equal;
  299.   VAR
  300.     file2:TF.File;
  301.     s:ARRAY 7 OF CHAR;
  302.     act1,act2:LONGINT;
  303.   BEGIN
  304.     GetArg3('File to Compare with: ');
  305.     IF TF.Open(file,arg1,BufSize,TF.oldFile) THEN
  306.       IF TF.Open(file2,arg3,BufSize,TF.oldFile) THEN
  307.         s:='  |  ';
  308.         REPEAT
  309.           act1:=TF.ReadBytes(file,SYSTEM.ADR(s[0]),1);
  310.           act2:=TF.ReadBytes(file2,SYSTEM.ADR(s[4]),1);
  311.         UNTIL (file.res#TF.done) OR (file2.res#TF.done) OR (s[0]#s[4]);
  312.         IF (act1=0) AND (act2=0) THEN
  313.           WriteStr('The Files are identical!')
  314.         ELSIF act1=0 THEN
  315.           io.WriteString('End of File ');
  316.           io.WriteString(arg1);
  317.           WriteStr(' reached!')
  318.         ELSIF act2=0 THEN
  319.           io.WriteString('End of File ');
  320.           io.WriteString(arg3);
  321.           WriteStr(' reached!')
  322.         ELSE
  323.           io.WriteString('Differences at position ');
  324.           io.WriteInt(TF.GetPos(file),6);
  325.           WriteStr(' detected:');
  326.           i:=0;
  327.           WHILE (i<10) AND (file.res=TF.done) AND (file2.res=TF.done) DO
  328.             INC(i);
  329.             Point(s[0],'.');
  330.             Point(s[4],'.');
  331.             WriteStr(s);
  332.             act1:=TF.ReadBytes(file,SYSTEM.ADR(s[0]),1);
  333.             act2:=TF.ReadBytes(file2,SYSTEM.ADR(s[4]),1);
  334.           END;
  335.         END;
  336.         IF TF.Close(file2) THEN END;
  337.       ELSE
  338.         io.WriteString('File ');
  339.         io.WriteString(arg3);
  340.         WriteStr(' not found');
  341.       END;
  342.       IF TF.Close(file) THEN END;
  343.     ELSE
  344.       io.WriteString('File ');
  345.       io.WriteString(arg1);
  346.       WriteStr(' not found');
  347.     END;
  348.   END Equal;
  349.  
  350.   PROCEDURE Find;
  351.     CONST
  352.       underlineColorOn='\[4m\[33m';
  353.       normalCharSet='\[0m';
  354.     VAR
  355.       pos:LONGINT;
  356.   BEGIN
  357.     GetArg3('String to search: ');
  358.     IF (len3>0) AND (TF.Open(file,arg1,BufSize,TF.oldFile)) THEN
  359.       REPEAT
  360.         pos:=TF.Search(file,arg3,len3);
  361.         IF pos=-1 THEN
  362.           WriteStr('String not found');
  363.           short[0]:='N';
  364.         ELSE
  365.           io.WriteString('String found at position: ');
  366.           io.WriteInt(pos,5);
  367.           i:=MinLongInt(pos,180);
  368.           IF TF.SetPos(file,-i,TF.current) THEN END;
  369.           c:=0X; (* #ASCII.eol *)
  370.           WHILE (i>0) AND (c#ASCII.eol) DO
  371.             act:=TF.ReadBytes(file,SYSTEM.ADR(c),1);
  372.             DEC(i);
  373.           END;
  374.           IF i=0 THEN
  375.             IF TF.SetPos(file,-MinLongInt(pos,180),TF.current) THEN END;
  376.           END;
  377.           io.WriteLn;
  378.           io.WriteLn;
  379.           WHILE (TF.GetPos(file)<pos) AND TF.ReadChar(file,c)  DO
  380.             Point(c,ASCII.eol);
  381.             io.Write(c);
  382.           END;
  383.           io.WriteString(underlineColorOn);
  384.           i:=0;
  385.           pos:=0;
  386.           WHILE TF.ReadChar(file,c) AND (pos<4) AND (i<180) DO
  387.             IF c=ASCII.eol THEN
  388.               INC(pos)
  389.             END;
  390.             Point(c,ASCII.eol);
  391.             io.Write(c);
  392.             INC(i);
  393.             IF i=len3 THEN
  394.               io.WriteString(normalCharSet);
  395.             END;
  396.           END;
  397.           file.res:=TF.done;
  398.           IF TF.SetPos(file,len3-i,TF.current) THEN END;
  399.           io.WriteLn;
  400.           io.WriteString('Search for next occurence? Y-J/N : ');
  401.           io.ReadString(short);
  402.           io.WriteLn;
  403.         END;
  404.       UNTIL (CAP(short[0])#'Y') AND (CAP(short[0])#'J');
  405.       IF TF.Close(file) THEN END;
  406.     ELSE
  407.       WriteStr(fnf);
  408.     END;
  409.   END Find;
  410.  
  411.   PROCEDURE Inline;
  412.   VAR
  413.     err:BOOLEAN;
  414.     destFile:TF.File;
  415.     twoByte:ARRAY 2 OF SHORTINT;
  416.     buf:ARRAY 13 OF CHAR;
  417.     act,i:LONGINT;
  418.     l:INTEGER;
  419.   BEGIN
  420.     GetArg3('Name of Destination File: ');
  421.     IF len3=0 THEN
  422.       WriteStr('No Destination File');
  423.       RETURN
  424.     END;
  425.     IF TF.Open(file,arg1,BufSize,TF.oldFile) THEN
  426.       IF TF.Open(destFile,arg3,BufSize,TF.newFile) THEN
  427.         i:=0;
  428.         buf:='    INLINE(';
  429.         IF TF.WriteBytes(destFile,SYSTEM.ADR(buf),11) THEN END;
  430.         LOOP
  431.           IF (i MOD 16)=0 THEN
  432.             buf:='       ';
  433.             buf[0]:=ASCII.eol;
  434.             IF TF.WriteBytes(destFile,SYSTEM.ADR(buf),7) THEN END;
  435.           END;
  436.           act:=TF.ReadBytes(file,SYSTEM.ADR(twoByte),2);
  437.           IF act=2 THEN
  438.             l:=SYSTEM.VAL(INTEGER,twoByte)
  439.           ELSIF act=1 THEN
  440.             l:=twoByte[0]
  441.           ELSE
  442.             EXIT
  443.           END;
  444.           INC(i,2);
  445.           err:=Conversions.IntToStr(l,buf,16,5,'0');
  446.           buf[5]:='H';
  447.           buf[6]:=',';
  448.           IF TF.WriteBytes(destFile,SYSTEM.ADR(buf),7) THEN END;
  449.         END;
  450.         buf[0]:=')';
  451.         buf[1]:=';';
  452.         buf[2]:=ASCII.eol;
  453.         IF TF.SetPos(destFile,-1,TF.current) THEN END;
  454.         IF TF.WriteBytes(destFile,SYSTEM.ADR(buf),3) THEN END;
  455.         io.WriteInt(i,6);
  456.         WriteStr(' Bytes Written.');
  457.         IF TF.Close(destFile) THEN END;
  458.       ELSE
  459.         WriteStr('Cannot open Destination File')
  460.       END;
  461.       IF TF.Close(file) THEN END;
  462.     ELSE
  463.       WriteStr(fnf)
  464.     END;
  465.   END Inline;
  466.  
  467. BEGIN
  468.   numArgs:=Arguments.NumArgs();
  469.   Arguments.GetArg(1,arg1);
  470.   Arguments.GetArg(2,arg2);
  471.   Arguments.GetArg(3,arg3);
  472.   IF arg1[0]='?' THEN
  473.     Usage
  474.   ELSE
  475.     IF numArgs=0 THEN
  476.       WriteStr("Usage: FileName 'x' [String]");
  477.       io.WriteString('FileName: ');
  478.       io.ReadString(arg1);
  479.     END;
  480.     IF numArgs<2 THEN
  481.       io.WriteString("Command: ");
  482.       io.ReadString(arg2);
  483.     END;
  484.     io.WriteLn;
  485.     len1:=Strings.Length(arg1);
  486.     len2:=Strings.Length(arg2);
  487.     len3:=Strings.Length(arg3);
  488.     IF (len2=1) AND (len1>0) THEN
  489.       CASE CAP(arg2[0]) OF
  490.         |'T':Type(FALSE)
  491.         |'S':Find
  492.         |'C':CodeIt(FALSE)
  493.         |'D':CodeIt(TRUE)
  494.         |'H':TypeHex
  495.         |'N':Type(TRUE)
  496.         |'P':Print(FALSE);
  497.         |'L':Print(TRUE);
  498.         |'I':Inline
  499.         |'E':Equal
  500.         |ELSE
  501.           Usage;
  502.       END;
  503.     ELSE
  504.       Usage
  505.     END;
  506.   END;
  507.   io.WriteLn;
  508. END TFD.
  509.  
  510.